<?php
namespace App\Common\Lib\Fun;

use App\Common as com;
use JetBrains\PhpStorm\ArrayShape;

class File {
	
	/**
	 * 返回指定文件的大小。
	 * @param string $filename 文件路径
	 * @param array $param 参数数组 <br />
	 * ················· [可空](int)	$param['cache']	说明：是否清除清除文件状态缓存.[0]不清除 [1:默认]清除	<br />
	 * ················· [可空/多选_A/必须](unknown_type)	$param['AAAAA']	说明：AAAAA	<br />
	 * @return int  若成功，则返回文件大小的字节数。若失败，则返回 false 并生成一条 E_WARNING 级的错误。
	 */
	public static function getFileSize( string $filename, array $param = [] ):int|false {
		// ...
		$param['cache'] = $param['cache'] ?? 1;
		//
		if( $param['cache'] == 1 ) clearstatcache();
		//
		return filesize( $filename );
	}

	/**
	 * Bytes 文件大小单位转换
	 * @param int $size Bytes
	 * @return array 转换结果信息[
	 * 		'size' => 文件大小
	 * 		'units' => 文件大小单位
	 * ]
	 */
	public static function formatBytesInfo( int $size ):array {
		$units = array( 'B', 'KB', 'MB', 'GB', 'TB' );
		for ( $i = 0; $size >= 1024 && $i < 4; $i++ ){
			$size /= 1024;
		}
		return [
			'size' => round( $size , 2 ),
			'units' => $units[$i],
		];
	}

	/**
	 * 获取文件后缀
	 * @param string $filename
	 * @param string $joinStr 附带的链接字符串
	 * @return string|null
	 */
	public static function getExtension( string $filename, string $joinStr = '' ): ?string{
		return $joinStr . ( new \SplFileInfo( $filename ) )->getExtension();
/*		$segments = explode( '.', $filename );
		//
		$extension = end( $segments ) ?? null;
		if( $extension !== null ){
			$extension = com\Lib\Fun\Str::filterSpecial( $extension );
		}
		//
		return $extension;*/
	}

	/**
	 * 解码base64，并生成信息组
	 * @param string $base64Str
	 * @return array{
	 *     blob: string,
	 *     type: string
	 * }|false [array]格式：[ 'blob' => '', 'type' => '文件类型(可能没有)' ] [false]解码失败
	 */
	public static function base64DecodeReInfo( string $base64Str ):array|false {
		if( $index = strpos( $base64Str,'base64,',0 ) ){
			$blob = base64_decode( substr( $base64Str, $index + 7 ) );
			//
			$typeStr = substr( $base64Str, 0, $index );
			preg_match( "/^data:(.*);$/", $typeStr, $arr );
			//
			return [
				'blob' => $blob,
				'type' => $arr[1],
			];
		}
		return false;
	}

}
